package com.jt;

/**
 * @author 金帮嘉诚 @date 2021-08-17 星期二 21:11
 */
public class Temp {
//    package com.jt;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.SpringApplication;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//import org.springframework.cloud.client.ServiceInstance;
//import org.springframework.cloud.client.loadbalancer.LoadBalanced;
//import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
//import org.springframework.context.annotation.Bean;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.client.RestTemplate;
//
//import java.util.Random;
//
//    /**
//     * @author 金帮嘉诚 @date 2021-08-17 星期二 10:49
//     */
//    @SpringBootApplication
//    public class ConsumerApplication {
//        public static void main(String[] args) {
//            SpringApplication.run(com.jt.ConsumerApplication.class, args);
//        }
//
//        @Bean//如果第三方写的类 要交给Spring管理 需要加该注解 才能在之后使用时加@Autowire自动管理
//        public RestTemplate restTemplate() {
//            return new RestTemplate();
//        }
//
//        @Bean//
//        @LoadBalanced
//        public RestTemplate loadBalanceRestTemplate() {
//            return new RestTemplate();
//        }
//
//        @RestController
//        public class ConsumerController {
//            @Autowired
//            private RestTemplate restTemplate;
//            /**
//             * 使用@Autowired 注解 描述属性时 会告诉Spring框架 要优先按属性类型进行对象的查找和注入,
//             * 假如此类型的对象存在多个,此时还会按照属性名进行查找比对,
//             * 有相同的则直接注入(DI),没有相同的则出错
//             * 当然也可以再添加一个注解@Qualifier,指定要注入的具体对象
//             */
//            @Autowired//先按类后按属性名
//            @Qualifier("loadBalanceRestTemplate")//
//            private RestTemplate l;//此处属性名必须和上方的方法名相同 不然要加value值
//
//            //从nacos获取服务列表--用算法选择服务实例
//            @Autowired
//            private LoadBalancerClient loadBalancerClient;
//
//            @Value("${server.port:8080}")
//            private String port;
//            //http://localhost:8090/consumer/rest/ssssssss
//
//
//            /**
//             * 不是负载均衡
//             */
//            @GetMapping("/consumer/echo1")
//            public String echo1() {
//                String url = "http://localhost:8080/provider/echo/这是echo2";
//                String result = restTemplate.getForObject(url, String.class);
//                return "得到的数据:" + result;
//            }
//
//            /**
//             * 手动模拟负载均衡 不灵活
//             */
//            @GetMapping("/consumer/echo2")
//            public String echo2() {
//                String msg = "**这是请求信息**";
//                //一个负载均衡例子
//                String url0 = "http://localhost:8080/provider/echo/" + msg;
//                String url1 = "http://localhost:8081/provider/echo/" + msg;
//                String[] urls = new String[]{url0, url1};
//
//                int anInt = new Random().nextInt(urls.length);
//                //又发起请求 属于重定向 (转发是服务器内部跳转)
//                String result = restTemplate.getForObject(urls[anInt], String.class);//返回provider的对应url的返回值
//
//                return port + "This is consumer say" + msg + " the result is " + result;
//            }
//
//
//            /**
//             * 负载均衡
//             */
//            @GetMapping("/consumer/rest/{msg}")
//            public String echo3(@PathVariable("msg") String msg) {
//                //基于loadBalance方式 获取服务实例
//                ServiceInstance choose = loadBalancerClient.choose("sca-provider");
//                //ip : 端口
////            String ip = choose.getHost();
////            int provider_port=choose.getPort();
////            String url = "http://"+ip+":"+provider_port+"/provider/echo/"+msg;
//                String url = String.format("http://%s:%s/provider/echo/%s", choose.getHost(), choose.getPort(), msg);
//                String object = restTemplate.getForObject(url, String.class);
//                return "consumer 得到的数据为:" + object;
//            }
//
//            /**
//             * 简化写法 相当于封装了echo3的部分代码 但是速度没有简化 增加了拦截器反而增加
//             */
//            @GetMapping("/consumer/echo4/{msg}")
//            public String echo4(@PathVariable("msg") String msg) {
//                String serviceId = "sca-provider";
//                String url = String.format("http://%s/provider/echo/%s", serviceId, msg);
//                return l.getForObject(url, String.class);
//            }
//        }
//
//
//    }

}
